/*
 * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
 * Licensed under the 【火山方舟】原型应用软件自用许可协议
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at 
 *     https://www.volcengine.com/docs/82379/1433703
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/**
 * Reformats the URL of the current page such that normal query parameters will
 * be received by AngularJS. If possible, this reformatting operation will be
 * performed using the HTML5 History API, thus avoiding reloading the page.
 *
 * For example, if a user visits the following URL:
 *
 *     http://example.org/some/application/?foo=bar
 *
 * this script will reformat the URL as:
 *
 *     http://example.org/some/application/#/?foo=bar
 *
 * If the URL does not contain query parameters, or the query parameters are
 * already in a format which AngularJS can read, then the URL is left
 * untouched.
 *
 * If query parameters are present both in the normal non-Angular format AND
 * within the URL fragment identifier, the query parameters are merged such
 * that AngularJS can read all parameters.
 *
 * @private
 * @param {Location} location
 *     The Location object representing the URL of the current page.
 */
 (function relocateParameters(location){

  /**
   * The default path, including leading '#' character, which should be used
   * if the URL of the current page has no fragment identifier.
   *
   * @constant
   * @type String
   */
  var DEFAULT_ANGULAR_PATH = '#/';

  /**
   * The query parameters within the URL of the current page, including the
   * leading '?' character.
   *
   * @type String
   */
  var parameters = location.search;

  /**
   * The base URL of the current page, containing only the protocol, hostname,
   * and path. Query parameters and the fragment, if any, are excluded.
   *
   * @type String
   */
  var baseUrl = location.origin + location.pathname;

  /**
   * The Angular-specific path within the fragment identifier of the URL of
   * the current page, including the leading '#' character of the fragment
   * identifier. If no fragment identifier is present, the deafult path will
   * be used.
   *
   * @type String
   */
  var angularUrl = location.hash || DEFAULT_ANGULAR_PATH;

  /**
   * Appends the given parameter string to the given URL. The URL may already
   * contain parameters.
   *
   * @param {String} url
   *     The URL that the given parameters should be appended to, which may
   *     already contain parameters.
   *
   * @param {String} parameters
   *     The parameters which should be appended to the given URL, including
   *     leading '?' character.
   *
   * @returns {String}
   *     A properly-formatted URL consisting of the given URL and additional
   *     parameters.
   */
  var appendParameters = function appendParameters(url, parameters) {

      // If URL already contains parameters, replace the leading '?' with an
      // '&' prior to appending more parameters
      if (url.indexOf('?') !== -1)
          return url + '&' + parameters.substring(1);

      // Otherwise, the provided parameters already contains the necessary
      // '?' character - just append
      return url + parameters;

  };

  // If non-Angular query parameters are present, reformat the URL such that
  // they are after the path and thus visible to Angular
  if (parameters) {

      // Reformat the URL such that query parameters are after Angular's path
      var reformattedUrl = appendParameters(baseUrl + angularUrl, parameters);

      // Simply rewrite the visible URL if the HTML5 History API is supported
      if (window.history && history.replaceState)
          history.replaceState(null, document.title, reformattedUrl);

      // Otherwise, redirect to the reformatted URL
      else
          location.href = reformattedUrl;

  }

})(window.location);
